/**
 * @param {number[][]} grid
 * @return {number}
 */

var orangesRotting = function (grid) {
    let r = grid.length
    let c = grid[0].length
    let queue = []
    let res = -1
    // 右下左上移动
    let x = [0, 1, 0, -1]
    let y = [1, 0, -1, 0]
    let map = new Map()
    // 将所有腐烂的橘子坐标全部推入queue
    for (let i = 0; i < r; i++) {
        for (j = 0; j < c; j++) {
            map.set(grid[i][j])
            if (grid[i][j] === 2) {
                queue.push([i, j])
            }
        }
    }
    // 如果最后没有烂橘子 也没有好橘子 说明根本不需要等待
    if(!map.has(1)&&!map.has(2)){
        return 0
    }
    while (queue.length) {
        let len = queue.length
        // 遍历每一次queue中腐烂橘子 让其周围的橘子都变为腐烂
        while (len) {
            let top = queue.shift()
            for (let k = 0; k < 4; k++) {
                let nx = top[0] + x[k]
                let ny = top[1] + y[k]
                if (nx >= 0 && nx < r && ny >= 0 && ny < c) {
                    // 如果橘子为新鲜的 则推入queue 代表其即将腐烂
                    if (grid[nx][ny] === 1) {
                        queue.push([nx, ny])
                        grid[nx][ny] = 2
                    }
                }
            }
            len--
        }
        // 遍历一次queue 就代表一分钟
        res++
    }
    // 如果有橘子无法变为腐烂 则不可能 返回-1
    for (let i = 0; i < r; i++) {
        for (j = 0; j < c; j++) {
            if (grid[i][j] === 1) {
                return -1
            }
        }
    }
    return res
};